As Subs e funções abaixo permitem fazer uma consulta no MS SQL Server e trazer seus resultado numa planilha.
O trabalho é bastante facilitado pelo elemento usado para acessar o MS SQL Server - O Activex Data Access Object -
para os mais íntimos, DAO. Ele devolve um recordset que pode ser facilmente colado numa planilha.
Contudo lembre-se que o VBA não possui tipos de variáveis fortemente tipadas ( veja a variável tipo variant
por exemplo.). Sendo assim tome cuidado, o VBA converte facilmente e evita erros de acesso quando traz as infos
do MS SQL Server já o contrario não é verdadeiro, se você está enviando um string para o ms sql server precisa
colocar ele entre aspas simples e ele não converte tipos automaticamente como o vba faz.
São bons exemplos mas não se esqueça de alterar : banco de dados, base de dados, usuário, senha e até as pesquisas para o que você precisa fazer. Todas elas foram testadas e funcionam mas tive que trocar algumas informaçõe para preservar e identidade da fonte.
Importante : No Visual studio você pode usar + ou & para concatenar strings mas no VBA só use &.
Option Explicit
'######################################################################################
'# Módulo 1 - Comunicação com o SQL Server
'######################################################################################
'O acesso do Excel ao MS SQL Server é feito via DAO
'Portanto precisamos adicionar referencias ao Microsoft Activex DataObjects
'Para isso vá até ferramentas(Tools), Referências(References)
' e selecione 'Microsoft Active X Data Objects 2.x library' - Eu selecionei a 2.8
Public Sub CarregarEmpresas()
Dim Cn As adodb.Connection
Dim Server_Name As String
Dim Database_Name As String
Dim User_ID As String
Dim Password As String
Dim rs As adodb.Recordset
Set rs = New adodb.Recordset
Dim strsql As String
Dim NomePlanilha As String
On Local Error GoTo saida2
'Cabecalho_Empresas
NomePlanilha = "Empresas"
LimparPlanilha1 (NomePlanilha)
strsql = "SELECT distinct emp.DESCEMPRESA, emp.EMP_COD"
strsql = strsql & " FROM tab_empresas AS emp"
strsql = strsql & " WHERE (emp.GRUPO NOT IN ('EMP1', 'EMP2'))"
Server_Name = "IP_SERVIDOR"
Database_Name = "BANCO_DE_DADOS"
User_ID = "USUARIO"
Password = "SENHA"
Set Cn = New adodb.Connection
Cn.Open "Driver={SQL Server};Server=" & Server_Name & ";Database=" & Database_Name & ";Uid=" & User_ID & ";Pwd=" & Password & ";"
rs.Open strsql, Cn, adOpenStatic
'With Worksheets(NomePlanilha).Range("a2:z500")
' .ClearContents
' .CopyFromRecordset rs
'End With
TransfereRecordSetParaPlanilha NomePlanilha, "A", "1", rs
rs.Close
Set rs = Nothing
Sheets(NomePlanilha).Select
MsgBox ("Os dados das Empresas carregadas com sucesso na planilha " + NomePlanilha)
Exit Sub
saida2:
MsgBox ("Erro:" + Err.Description)
End Sub
'muda o cabeçalho da planilha para algo que o pessoal está acostumado
Public Sub Cabecalho_PLAN1()
Dim a As String
Dim b() As String
Dim NomePlanilha As String
Dim c As Integer
On Local Error GoTo saida3
a = "EMP_FAT,EMP_VENDA,ESTOQUE,PLACA,MODELO,PEDIDO,CLIENTE,NOME_CLIENTE,VALOR"
NomePlanilha = "PLANILHA2"
b = Split(a, ",")
Sheets(NomePlanilha).Select
Worksheets(NomePlanilha).range("a1:zz1").ClearContents
For c = 1 To UBound(b) + 1
Cells(1, c).Value = b(c - 1) 'linha,coluna
Cells(1, c).Interior.ColorIndex = 37
Next
Exit Sub
saida3:
MsgBox ("Erro:" + Err.Description)
End Sub
Public Sub CarregarDadosPLANILHA2"
Dim Cn As adodb.Connection
Dim Server_Name As String
Dim Database_Name As String
Dim User_ID As String
Dim Password As String
Dim rs As adodb.Recordset
Set rs = New adodb.Recordset
Dim strsql As String * 2000
Dim ConteudoCell As Variant
Dim linha As Integer
Dim NomePlanilha As String
Dim a As Integer
On Local Error GoTo saida4
NomePlanilha = "PLANILHA2"
LimparPlanilha1 (NomePlanilha)
Cabecalho_PLAN1
strsql = "exec [IP_SERVIDORX].BDy.dbo.procz '"
'trazendo a lista de Cód de empresas da planilha Empresas de B1 até encontrar branco
'Cuidado : as planilhas nem sempre tem a última linha preenchida em todas as colunas
Sheets("Empresas").Select
linha = 2 'linha 1 tem o header
ConteudoCell = Cells(linha, 2).Value 'linha,coluna 2=col B
While ConteudoCell <> ""
strsql = Trim(strsql) & ConteudoCell & ","
linha = linha + 1
ConteudoCell = Cells(linha, 2).Value 'linha,coluna 2=col B
Wend
strsql = Left(Trim(strsql), Len(Trim(strsql)) - 1) 'retirando a ,
strsql = Trim(strsql) & "'"
If Len(strsql) < 100 Then
MsgBox ("Lista de Cód de Empresas em branco")
Exit Sub
End If
Server_Name = "IP_SERVIDOR"
Database_Name = "BANCO_DE_DADOS"
User_ID = "USUARIO"
Password = "SENHA"
Set Cn = New adodb.Connection
Cn.Open "Driver={SQL Server};Server=" & Server_Name & ";Database=" & Database_Name & ";Uid=" & User_ID & ";Pwd=" & Password & ";"
rs.CursorLocation = adUseClient
rs.Open strsql, Cn, adOpenStatic 'adOpenForwardOnly
With Worksheets(NomePlanilha).range("a2:az1000")
.ClearContents
.CopyFromRecordset rs
End With
'TransfereRecordSetParaPlanilha NomePlanilha, "A", "1", rs
rs.Close
Set rs = Nothing
'celula tipo dinheiro
a = ConverterParaNúmero("P") 'VALOR_ITEM1
Sheets(NomePlanilha).Columns(a).NumberFormat = "#,###.00"
'celula tipo dinheiro 'VALOR_ITEM2
a = ConverterParaNúmero("Q")
Sheets(NomePlanilha).Columns(a).NumberFormat = "#,###.00"
'celula tipo dinheiro 'VALOR_ITEM3
a = ConverterParaNúmero("R")
Sheets(NomePlanilha).Columns(a).NumberFormat = "#,###.00"
Sheets(NomePlanilha).Select
MsgBox ("Dados PLANILHA2 Carregados com sucesso na planilha " + NomePlanilha)
Exit Sub
saida4:
MsgBox ("Erro:" + Err.Description)
End Sub
'coloca o cabeçalho do PROCt como o pessoal do fiscal está acostumado a ver
Public Sub Cabecalho_PROCt()
Dim a As String
Dim b() As String
Dim NomePlanilha As String
Dim c As Integer
On Local Error GoTo saida5
NomePlanilha = "PROCt-Servidor k"
'LimparPlanilha1 (NomePlanilha)
a = "COD_EMP,NOME_EMP,DESCRICAO,OFERTA, OFERECIDO"
b = Split(a, ",")
Sheets(NomePlanilha).Select
Worksheets(NomePlanilha).range("a1:az1000").ClearContents
For c = 1 To UBound(b) + 1
Cells(1, c).Value = b(c - 1) 'linha,coluna
Cells(1, c).Interior.ColorIndex = 37
Next
Exit Sub
saida5:
MsgBox ("Erro:" + Err.Description)
End Sub
Public Sub CarregarPedidosNAOPAGOSSERVIDORd()
Dim Cn As adodb.Connection
Dim Server_Name As String
Dim Database_Name As String
Dim User_ID As String
Dim Password As String
Dim rs As adodb.Recordset
Set rs = New adodb.Recordset
Dim strsql As String
Dim di, df As Date
Dim sdi, sdf As String
Dim rasc As String
Dim NomePlanilha As String
Dim a As Integer
On Local Error GoTo saida6
NomePlanilha = "PROCt-SistemaU"
LimparPlanilha1 (NomePlanilha)
Cabecalho_PROCt
'formatanto o período
di = Now
df = DateAdd("d", -1, di) 'data final : ontem
di = DateAdd("m", -6, di) ' 6 meses antes da data corrente
sdi = CStr(DatePart("yyyy", di))
rasc = CStr(DatePart("m", di))
If Len(rasc) = 1 Then
sdi = sdi + "0" + rasc
Else
sdi = sdi + rasc
End If
rasc = CStr(DatePart("d", di))
If Len(rasc) = 1 Then
sdi = sdi + "0" + rasc
Else
sdi = sdi + rasc
End If
sdf = CStr(DatePart("yyyy", df))
rasc = CStr(DatePart("m", df))
If Len(rasc) = 1 Then
sdf = sdf + "0" + rasc
Else
sdf = sdf + rasc
End If
rasc = CStr(DatePart("d", df))
If Len(rasc) = 1 Then
sdf = sdf + "0" + rasc
Else
sdf = sdf + rasc
End If
strsql = "exec PROCt_PedidoNaoPago "
strsql = "exec PROCt_PedidoNaoPago px,'idusu', " + sdi + "," + sdf + ",py, pz, T, E, pw"
Server_Name = "Servidorww"
Database_Name = "Itavema_DealernetWF"
User_ID = "USUARIO"
Password = "SENHA"
Set Cn = New adodb.Connection
Cn.Open "Driver={SQL Server};Server=" & Server_Name & ";Database=" & Database_Name & ";Uid=" & User_ID & ";Pwd=" & Password & ";"
rs.Open strsql, Cn, adOpenForwardOnly 'adOpenStatic
'MsgBox rs.Fields.Count '36 campos - ok
'Application.Calculation = xlManual
' With Worksheets(NomePlanilha).Range("a2:az1000")
' .ClearContents
' .CopyFromRecordset rs
' End With
TransfereRecordSetParaPlanilha NomePlanilha, "A", "1", rs
rs.Close
Set rs = Nothing
'celula tipo dinheiro
a = ConverterParaNúmero("P")
Sheets(NomePlanilha).Columns(a).NumberFormat = "#,###.00"
'celula tipo dinheiro
a = ConverterParaNúmero("U")
Sheets(NomePlanilha).Columns(a).NumberFormat = "#,###.00"
'convertendo celula para texto
a = ConverterParaNúmero("F")
Sheets(NomePlanilha).Columns(a).NumberFormat = "@"
'convertendo celula para texto
a = ConverterParaNúmero("H")
Sheets(NomePlanilha).Columns(a).NumberFormat = "@"
'convertendo celula para texto
a = ConverterParaNúmero("K")
Sheets(NomePlanilha).Columns(a).NumberFormat = "@"
'convertendo celula para texto
a = ConverterParaNúmero("M")
Sheets(NomePlanilha).Columns(a).NumberFormat = "@"
'convertendo celula para texto
a = ConverterParaNúmero("O")
Sheets(NomePlanilha).Columns(a).NumberFormat = "@"
'convertendo celula para texto
a = ConverterParaNúmero("R")
Sheets(NomePlanilha).Columns(a).NumberFormat = "@"
'celula tipo número
a = ConverterParaNúmero("Z")
Sheets(NomePlanilha).Columns(a).NumberFormat = "#,##0"
'celula tipo número
a = ConverterParaNúmero("AA")
Sheets(NomePlanilha).Columns(a).NumberFormat = "#,##0"
'celula tipo dinheiro
a = ConverterParaNúmero("AB")
Sheets(NomePlanilha).Columns(a).NumberFormat = "#,###.00"
'convertendo celula para texto
a = ConverterParaNúmero("AE")
Sheets(NomePlanilha).Columns(a).NumberFormat = "@"
'convertendo celula para texto
a = ConverterParaNúmero("AJ")
Sheets(NomePlanilha).Columns(a).NumberFormat = "@"
Sheets(NomePlanilha).Select
MsgBox ("Dados de Pedidos Não Pagos Sistema X Carregados com sucesso na planilha " + NomePlanilha)
Exit Sub
saida6:
MsgBox ("Erro:" + Err.Description)
End Sub
Public Sub Cab_Lancamentos()
Dim a As String
Dim b() As String
Dim NomePlanilha As String
Dim c As Integer
On Local Error GoTo saida5
NomePlanilha = "Lancamentos"
'LimparPlanilha1 (NomePlanilha)
a = "Descr, ContaBanco,CodVeiculo, Saldo, DataCaixa, Historico"
b = Split(a, ",")
Sheets(NomePlanilha).Select
Worksheets(NomePlanilha).range("a1:az1000").ClearContents
For c = 1 To UBound(b) + 1
Cells(1, c).Value = b(c - 1) 'linha,coluna
Cells(1, c).Interior.ColorIndex = 37
Next
Exit Sub
saida5:
MsgBox ("Erro:" + Err.Description)
End Sub
Public Sub TrazerPagamentosPerdidos()
Dim Cn As adodb.Connection
Dim Server_Name As String
Dim Database_Name As String
Dim User_ID As String
Dim Password As String
Dim rs As adodb.Recordset
Set rs = New adodb.Recordset
Dim strsql As String
Dim di, df As Date
Dim sdi, sdf As String
Dim NomePlanilha As String
Dim rasc As String
On Local Error GoTo saida7
NomePlanilha = "Lancamentos"
LimparPlanilha1 (NomePlanilha)
Cab_Lancamentos
'formatanto o período
di = Now
df = DateAdd("d", -1, di) 'data final : ontem
If Day(di) > 1 Then
di = Year(di) & "-" & Month(di) & "-01" ' primeiro dia do mês corrente
Else
di = Year(di) & "-" & Month(di) - 1 & "-01" ' primeiro dia do mês corrente
End If
sdi = CStr(DatePart("yyyy", di)) & "-"
rasc = CStr(DatePart("m", di))
If Len(rasc) = 1 Then
sdi = sdi & "0" & rasc & "-"
Else
sdi = sdi & rasc & "-"
End If
rasc = CStr(DatePart("d", di))
If Len(rasc) = 1 Then
sdi = sdi + "0" + rasc
Else
sdi = sdi + rasc
End If
sdf = CStr(DatePart("yyyy", df)) & "-"
rasc = CStr(DatePart("m", df))
If Len(rasc) = 1 Then
sdf = sdf + "0" + rasc & "-"
Else
sdf = sdf + rasc & "-"
End If
rasc = CStr(DatePart("d", df))
If Len(rasc) = 1 Then
sdf = sdf + "0" + rasc
Else
sdf = sdf + rasc
End If
strsql = " WITH CTE AS ("
strsql = strsql + " Select p1,"
strsql = strsql + " p2...,"
strsql = strsql + " from BANCOX.DBO.PROCQ Q (nolock)"
strsql = strsql + " INNER JOIN BANCOQ.DBO.PROCU U (nolock) ON (U.PX = Q.PX and U.PY = 'S')"
strsql = strsql + " Where Q.PR is null "
strsql = strsql + " And CPODT >= '" + sdi + "'"
strsql = strsql + " and CPOFT <= '" + sdf + "'"
strsql = strsql + " Group by PQ,P2,P3 "
strsql = strsql + " ) "
strsql = strsql + " SELECT * FROM CTE WHERE P2=X "
Server_Name = "IPSERVIDORP"
Database_Name = "BANCOR"
User_ID = "USUARIOX"
Password = "SENHASEC"
Set Cn = New adodb.Connection
Cn.Open "Driver={SQL Server};Server=" & Server_Name & ";Database=" & Database_Name & ";Uid=" & User_ID & ";Pwd=" & Password & ";"
rs.Open strsql, Cn, adOpenForwardOnly 'adOpenStatic
With Worksheets(NomePlanilha).range("a2:az1000")
.ClearContents
.CopyFromRecordset rs
End With
rs.Close
Set rs = Nothing
Sheets(NomePlanilha).Select
MsgBox ("Dados de Pagamentos Perdidos foram carregados com sucesso na planilha " + NomePlanilha)
Exit Sub
saida7:
MsgBox ("Erro:" + Err.Description)
End Sub